package com.agritech.command;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 遥控器类（命令调用者）
 * 命令模式的调用者，负责执行命令和管理命令历史（用于撤销）
 */
public class RemoteControl {
    private Command command;
    private final Stack<Command> commandHistory; // 命令历史，用于撤销
    private final List<Command> commandQueue; // 命令队列，用于批量执行

    public RemoteControl() {
        this.commandHistory = new Stack<>();
        this.commandQueue = new ArrayList<>();
    }

    /**
     * 设置单个命令
     * @param command 要设置的命令
     */
    public void setCommand(Command command) {
        this.command = command;
    }

    /**
     * 执行当前设置的单个命令
     */
    public void pressButton() {
        if (command != null) {
            System.out.println("遥控器按下按钮，执行: " + command.getDescription());
            command.execute();
            commandHistory.push(command); // 将执行的命令加入历史记录
        } else {
            System.out.println("遥控器未设置命令");
        }
    }

    /**
     * 撤销上一个执行的命令
     */
    public void pressUndoButton() {
        if (!commandHistory.isEmpty()) {
            Command lastCommand = commandHistory.pop();
            System.out.println("遥控器按下撤销按钮，撤销: " + lastCommand.getDescription());
            lastCommand.undo();
        } else {
            System.out.println("命令历史为空，无操作可撤销");
        }
    }

    /**
     * 添加命令到队列
     * @param cmd 要添加的命令
     */
    public void addCommandToQueue(Command cmd) {
        if (cmd != null) {
            commandQueue.add(cmd);
            System.out.println("命令 '" + cmd.getDescription() + "' 已添加到队列");
        }
    }

    /**
     * 执行队列中的所有命令
     */
    public void executeCommandQueue() {
        if (commandQueue.isEmpty()) {
            System.out.println("命令队列为空，无命令可执行");
            return;
        }
        System.out.println("开始执行命令队列中的 " + commandQueue.size() + " 个命令:");
        for (Command cmd : commandQueue) {
            System.out.println("  执行队列命令: " + cmd.getDescription());
            cmd.execute();
            commandHistory.push(cmd); // 将执行的命令加入历史记录
        }
        commandQueue.clear(); // 清空队列
        System.out.println("命令队列执行完毕");
    }

    /**
     * 清空命令队列
     */
    public void clearCommandQueue() {
        commandQueue.clear();
        System.out.println("命令队列已清空");
    }

    /**
     * 查看命令历史（最近的几个）
     * @param count 要查看的命令数量
     */
    public void viewCommandHistory(int count) {
        if (commandHistory.isEmpty()) {
            System.out.println("命令历史为空");
            return;
        }
        System.out.println("最近 " + Math.min(count, commandHistory.size()) + " 条命令历史:");
        // 迭代器从栈顶开始，所以需要反向打印或复制到列表再反转
        List<Command> tempList = new ArrayList<>(commandHistory);
        int start = Math.max(0, tempList.size() - count);
        for (int i = tempList.size() - 1; i >= start; i--) {
            System.out.println("  - " + tempList.get(i).getDescription());
        }
    }
}